package com.imooc.concurrent.threadAndRunnable;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Scanner;

/**
 * 运行在后台，为其他前台线程服务
 * 一旦所有的用户线程都结束运行，守护线程会随JVM一起结束工作
 * 应用：
 *  数据库连接池中的监测线程
 *  JVM虚拟机启动后的监测线程
 *  垃圾回收线程
 * 注意事项：
 *  设置为守护线程：setDaemin(true),一定要在start()方法之前调用，否则会抛出IllegalThreadStateException
 *  在守护线程中产生的新线程也是守护线程
 *  不是所有的任务都可以分配给守护线程来执行，比如读写操作或者计算逻辑
 * 查看线程快照工具：
 *   jdk自带的jstack:
 *     jstack [-l] {pid}
 */
public class DaemonDemo {
    public static void main(String[] args) {
        System.out.println("进入了主线程"+Thread.currentThread().getName());
        DaemonThread daemonThread = new DaemonThread();
        Thread thread = new Thread(daemonThread);
        thread.setDaemon(true);
        thread.start();
        Scanner scanner = new Scanner(System.in);
        scanner.next();
        System.out.println("退出了主线程"+Thread.currentThread().getName());
    }

}

class DaemonThread implements Runnable{

    @Override
    public void run() {
        System.out.println("进入守护线程"+Thread.currentThread().getName());
        try {
            writeToFile();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("退出守护线程"+Thread.currentThread().getName());
    }

    private void writeToFile() throws Exception {

        File fileName = new File("D:" + File.separator + "daemon.txt");
        OutputStream os = new FileOutputStream(fileName, true);
        int count = 0;
        while (count<999){
            os.write(("\r\nword"+count).getBytes());
            System.out.println("守护线程"+Thread.currentThread().getName()+"向文件中写入了word"+count++);
            Thread.sleep(1000);
        }
    }
}
